import logging
import os
from logging.handlers import RotatingFileHandler
from datetime import datetime

def setup_logger(log_dir="logs"):
    """
    设置并返回一个简单有效的日志记录器
    
    使用指南:
    - logger.debug("调试详细信息")
    - logger.info("常规运行信息")
    - logger.warning("警告信息")
    - logger.error("错误信息")
    - logger.critical("严重错误")
    """
    # 创建日志目录
    os.makedirs(log_dir, exist_ok=True)
    
    # 创建格式化器（新增文件名和函数名）
    formatter = logging.Formatter(
        fmt='%(asctime)s [%(levelname)s] %(filename)s:%(lineno)d - %(funcName)s() - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    )
    
    # 创建日志记录器
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)  # 默认级别
    
    # 检查是否已经存在文件处理器
    has_file_handler = any(
        isinstance(handler, RotatingFileHandler)
        for handler in logger.handlers
    )
    
    if not has_file_handler:
        # 生成以时间命名的日志文件名
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        log_filename = f"app_{timestamp}.log"
        
        # 文件处理器 - 滚动日志文件（最多5个文件，每个10MB）
        file_handler = RotatingFileHandler(
            filename=os.path.join(log_dir, log_filename),
            maxBytes=10 * 1024 * 1024,  # 10 MB
            backupCount=5  # 保留5个备份
        )
        file_handler.setFormatter(formatter)
        logger.addHandler(file_handler)
    
    return logger

# 使用示例 =======================================================

# 初始化日志记录器（通常在程序入口处调用一次）
logger = setup_logger()

def main():
    logger.info("===== 程序启动 =====")
    
    try:
        # 示例业务逻辑
        logger.debug("执行某些操作...")
        result = 10 / 2
        logger.info(f"计算结果: {result}")
        
        # 模拟一个错误情况
        raise ValueError("这是一个模拟的错误")
        
    except Exception as e:
        logger.error(f"发生错误: {e}", exc_info=True)
        logger.exception("这是使用 logger.exception 的完整错误堆栈")
    
    logger.info("===== 程序结束 =====")

if __name__ == "__main__":
    main()